<?php

/**
 * 读取 PHP 原始数据文件，输出到指定的 SQL 文件
 * 遍历当前文件同级的所有目录下的所有 PHP 文件。
 */
$srcDir = '../src/';
$sqlfile = '../output/data.sql';
php2sql($srcDir, $logFile, true);
echo 'success!';

/**
 * 从PHP文件转换到SQL
 * 遍历当前文件同级的所有目录下的所有PHP文件。
 * @param string $srcDir '../src/'
 * @param string $logFile '../data.sql'
 * @param boolean $isEcho false
 * @return array
 */
function php2sql($srcDir, $logFile = '', $isEcho = false)
{
    $isLog = false;
    if ($logFile) {
        $isLog = true;
        file_put_contents($logFile, '');
    }
    $sqlArr = [];
    $sql = '';
    $fsi = new FilesystemIterator($srcDir);
    foreach ($fsi as $fileInfo) {
        if (in_array($fileInfo->getFilename(), ['.', '..'])) {
            continue;
        }
        if (0 === strpos($fileInfo->getFilename(), '_')) {
            // 文件名称或目录名称以下划线开头则当成草稿文件跳过。
            continue;
        }
        if ($fileInfo->isDir()) {
            $fsi2 = new FilesystemIterator($srcDir . $fileInfo->getFilename());
            foreach ($fsi2 as $fileInfo2) {
                if (0 === strpos($fileInfo2->getFilename(), '_')) {
                    // 文件名称或目录名称以下划线开头则当成草稿文件跳过。
                    continue;
                }
                $filename = $fileInfo2->getFilename();
                if (strpos($filename, '.php')) {
                    $config = require $fileInfo2->getRealPath();
                    if (isset($config['enable']) && !$config['enable']) {
                        unset($config);
                        // 数据中包含 enable = false 开关选项，跳过。
                        continue;
                    }
                    $list = $config['data'];
                    $append = $config['append'] ?? false;
                    $isTruncate = $config['truncate'] ?? false;
                    $isTree = $config['is_tree'] ?? false;
                    $startId = $config['start_id'] ?? 0;
                    if ($isEcho) {
                        echo '处理：', ($config['text'] ?? $filename), ' [', $fileInfo2->getPath(), ']', PHP_EOL;
                    }
                    if ($isLog) {
                        file_put_contents($sqlfile, '-- ' . ($config['text'] ?? $filename) . PHP_EOL, FILE_APPEND);
                    }
                    if ($isTruncate) {
                        $sql = 'truncate table ' . ($config['table'] ?? '{table}') . ';';
                        $sqlArr[] = $sql;
                        if ($isLog) {
                            file_put_contents($sqlfile, ($sql . PHP_EOL), FILE_APPEND);
                        }
                    }
                    if ($isTree) {
                        $id = $startId;
                        $pid = 0;
                        $pid2 = 0;
                        $pid3 = 0;
                        $sqlValues = [];
                        $idArr = [];
                        foreach ($list as $row) {
                            $id++;
                            $idArr[] = $id;
                            $sqlValues = $row;
                            $sqlValues['id'] = $id;
                            $sqlValues['pid'] = $pid;
                            if (isset($sqlValues['children'])) {
                                unset($sqlValues['children']);
                            }
                            if ($append) {
                                $sqlValues = array_merge($sqlValues, $append);
                            }
                            $sql = 'insert into `' . $config['table'] . '` (`' . implode('`, `', array_keys($sqlValues)) . '`) values (\'' . implode('\', \'', array_values($sqlValues)) . '\');' . PHP_EOL;
                            $sqlArr[] = $sql;
                            if ($isLog) {
                                file_put_contents($sqlfile, $sql, FILE_APPEND);
                            }
                            if (!isset($row['children'])) {
                                continue;
                            }
                            $pid2 = $id;
                            foreach ($row['children'] as $row2) {
                                $id++;
                                $idArr[] = $id;
                                $sqlValues = $row2;
                                $sqlValues['id'] = $id;
                                $sqlValues['pid'] = $pid2;
                                if (isset($sqlValues['children'])) {
                                    unset($sqlValues['children']);
                                }
                                if ($append) {
                                    $sqlValues = array_merge($sqlValues, $append);
                                }
                                $sql = 'insert into `' . $config['table'] . '` (`' . implode('`, `', array_keys($sqlValues)) . '`) values (\'' . implode('\', \'', array_values($sqlValues)) . '\');' . PHP_EOL;
                                $sqlArr[] = $sql;
                                if ($isLog) {
                                    file_put_contents($sqlfile, $sql, FILE_APPEND);
                                }
                                if (!isset($row2['children'])) {
                                    continue;
                                }
                                $pid3 = $id;
                                foreach ($row2['children'] as $row3) {
                                    $id++;
                                    $idArr[] = $id;
                                    $sqlValues = $row3;
                                    $sqlValues['id'] = $id;
                                    $sqlValues['pid'] = $pid3;
                                    if (isset($sqlValues['children'])) {
                                        unset($sqlValues['children']);
                                    }
                                    if ($append) {
                                        $sqlValues = array_merge($sqlValues, $append);
                                    }
                                    $sql = 'insert into `' . $config['table'] . '` (`' . implode('`, `', array_keys($sqlValues)) . '`) values (\'' . implode('\', \'', array_values($sqlValues)) . '\');' . PHP_EOL;
                                    $sqlArr[] = $sql;
                                    if ($isLog) {
                                        file_put_contents($sqlfile, $sql, FILE_APPEND);
                                    }
                                }
                            }
                        }
                        if (isset($config['update_sql'])) {
                            $sql = trim(str_replace('__ids__', implode(',', $idArr), $config['update_sql'])) . PHP_EOL;
                            $sqlArr[] = $sql;
                            if ($isLog) {
                                file_put_contents($sqlfile, (rtrim($sql, ';') . ';' . PHP_EOL), FILE_APPEND);
                            }
                        }
                        unset($idArr);
                        unset($sqlValues);
                    } else {
                        foreach ($list as $row) {
                            if ($append) {
                                $row = array_merge($row, $append);
                            }
                            $sql = 'insert into `' . $config['table'] . '` (`' . implode('`, `', array_keys($row)) . '`) values (\'' . implode('\', \'', array_values($row)) . '\');' . PHP_EOL;
                            $sqlArr[] = $sql;
                            if ($isLog) {
                                file_put_contents($sqlfile, $sql, FILE_APPEND);
                            }
                        }
                    }
                    if (isset($data)) {
                        // 释放引用文件中的 $data 变量
                        // echo 'unset data.';
                        unset($data);
                    }
                    unset($list);
                    unset($config);
                }
            }
        }
    }
    return $sqlArr;
}
